package es.uned.etsii.si3.taller.servlets;

import java.lang.reflect.Method;

import org.apache.struts2.StrutsStatics;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

import es.uned.etsii.si3.taller.FactoriaFunciones;
import es.uned.etsii.si3.taller.misc.ProporcionaFuncionalidad;


public class FuncionalidadInterceptor extends AbstractInterceptor implements StrutsStatics {
	private static final long serialVersionUID = 1L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		ActionProxy proxy = invocation.getProxy();
		Class<?> c = invocation.getAction().getClass();
		String method = proxy.getMethod();
		
		if (method == null)
			method = "execute";
		
		try {
			Method metodo = c.getDeclaredMethod(method);
			ProporcionaFuncionalidad anotacion = metodo.getAnnotation(ProporcionaFuncionalidad.class);

			if (anotacion != null) {
				boolean habilitada = FactoriaFunciones.getEstaActiva(anotacion.identificador());

				if (!habilitada)
					return "deshabilitada";
			}
		}
		catch (NoSuchMethodException e) {
			// Seguramente estamos accediendo a un execute no declarado,
			// que no se puede controlar, así que... no hacemos nada
		}
		
		return invocation.invoke();
	}
}